@SuppressWarnings({"all"})
public class ProcessProject {
    // 平均周转时间
    public static double avgTotalTime;
    // 平均带权周转时间
    public static double avgPowerTime;

    private static void Display(ProcessData[] processData) {
        System.out.println("到达时间\t" + "服务时间\t" + "完成时间\t" + "周转时间\t" + "带权周转时间\t");
        for (int i = 0; i < processData.length; i++) {
            System.out.println(processData[i]);
            avgTotalTime += processData[i].turnTime; // 求总周转时间，此时avgTotalTime中存储的值为总周转时间
            avgPowerTime += processData[i].powerTime;// 求总带权周转时间，此时avgPowerTime中存储的值为总带权周转时间
        }

        avgTotalTime = avgTotalTime / processData.length;
        avgPowerTime = avgPowerTime / processData.length;

        System.out.println("平均周转时间:" + avgTotalTime);
        System.out.println("平均带权周转时间:" + avgPowerTime);
    }

    // 先来先服务算法实现
    private static void FCFS(ProcessData[] processData) {
        int preFinished = 0; // 前一个作业的完成时间即为下一个作业的开始时间
        avgTotalTime = 0;    // 平均周转时间
        avgPowerTime = 0;  // 平均带权周转时间

        // 初始化完成时间、周转时间、带权周转时间的初值为0
        for (int i = 0; i < processData.length; i++) {
            processData[i].finishTime = 0; // 设置初始完成时间为0
            processData[i].turnTime = 0; // 设置初始周转时间为0
            processData[i].powerTime = 0; // 设置初始带权周转时间为0
        }

        // 如果第一个作业的到达时间不等于前一个作业的完成时间，就将前一个作业的完成时间定义为当前作业的到达时间
        if (processData[0].arriveTime != preFinished) {
            preFinished = processData[0].arriveTime;
        }

        for (int i = 0; i < processData.length; i++) {
            // 作业的完成时间为上一个作业的完成时间加当前作业的服务时间
            processData[i].finishTime = preFinished + processData[i].serviceTime;
            preFinished = processData[i].finishTime;
            // 周转时间 = 完成时间 - 到达时间
            processData[i].turnTime = processData[i].finishTime - processData[i].arriveTime;
            // 带权周转时间 = 作业的周转时间 / 系统提供服务的时间
            processData[i].powerTime = (double) processData[i].turnTime / (double) processData[i].serviceTime;
        }

        System.out.println("先来先服务（FCFS）算法：");

        // 打印进程的信息
        Display(processData);
    }

    public static void main(String[] args) {
        // 定义长度为4，类型为作业数据类的作业数组用于存储4个作业
        ProcessData[] processData = new ProcessData[4];

        // 定义四个作业
        processData[0] = new ProcessData(0, 20);
        processData[1] = new ProcessData(5, 15);
        processData[2] = new ProcessData(10, 5);
        processData[3] = new ProcessData(15, 10);

        // 调用先来先服务算法
        FCFS(processData);
    }
}
